// sframe.h
#ifndef _SFRAME_H
#define _SFRAME_H
#include <string>
#include "ScintillaWin.h"
#include "ide_ucw.h"
#include "options.h"
#include "debug_windows.h"

enum UseState { FINISHED, BREAK, RUNNING, BROKEN, READY };
enum ModifyResponse { SAVE, WAIT, RESET };

struct Position: public ItemObject {
    std::string file;
    int line;

    Position(std::string f, int l)
        : file(f),line(l) {}

	// override
	bool action();
};

class SFrame: public TFrameWindow {
private:
  ScintillaWin* m_sci;
  std::string m_path, m_parameters, m_cwd, m_working_dir;
  bool m_untitled, m_show_line_nos, m_do_connect,m_prompt_parm;
  ModifyResponse m_modify_response;
  ItemObject* m_delayed_op;
  IniFile *m_ini;
  AutoMenu *m_files_used;
  AutoMenu *m_views_open;
  TOpenFile* m_of;
  FormOptions* m_form_pos; 
  UCW* m_ucw;
  IDE* m_ide;
  UseState m_state;
  int m_exec_line;
  WindowList* m_debug_windows;
public:
  UCW* ucw() { return m_ucw; }
  IDE* ide() { return m_ide; }
  ScintillaWin* view() { return m_sci; }
  static ScintillaWin* current_view();
  void update_caption();
  bool open_at(Position* pos);
  bool load_file(const char* file);
  void do_new(int);
  void do_open(int);
  void do_save(int);
  void do_save_as(int);
  bool set_filename(const char *filename);
  bool set_filename(string file)
  { return set_filename(file.c_str()); }

  bool set_modified(bool yesno);
  void set_selected_view();
  void set_current_view(const char* filename, ScintillaWin* sci);
  bool go_to_filepos();
  void handle_trouble(string s);
  void error(string msg);
  void warning(string msg);
  void stop_marker(bool on_off,int line = 0);

  void set_state(UseState s);
  bool can_run();

  void do_expand(int);
  void do_goto_cursor(int);
  void do_exit(int) { close(); }
  void do_undo(int) { m_sci->undo(); }
  void do_redo(int) { m_sci->redo(); }
  void do_cut(int)  { m_sci->cut();  }
  void do_copy(int) { m_sci->copy(); }
  void do_paste(int){ m_sci->paste();}
  void do_select_function(int);
  void do_line_nos(int);
  void do_match_brace(int);
  void do_find(int);
  void do_find_next(int);
  void do_files_list(int);
  void do_goto_line(int);
  void do_toggle_marker(int);
  void do_goto_next_marker(int);
  void do_swap_header(int);
  void do_swap_top(int);
  void do_close_view(int);
  void do_windows(int);
  void do_about(int);
  void do_update(int);
  void do_parameters(int);
  void do_open_document(int);
  void do_zoom_in(int)  { m_sci->zoom_in(); }
  void do_zoom_out(int) { m_sci->zoom_out(); }
  void do_run_underc(int);
  void do_reload(int);
  void do_insert_file(int);
  void do_copy_file(int);
  void do_operate_on_selection(int);
  void do_insert_watch_var(int);
  void do_short_filenames(int);
  void do_compile_function(int);
  void do_show_watch(int);
  void do_show_locals(int);
  void do_show_call_stack(int);

  void do_run(int);
  void do_compile(int);
  void do_toggle_breakpoint(int);
  void do_single_step(int);
  void do_step_over(int);
  void do_stop(int);
  bool compile_current_file(bool explicit_cmd);
  void on_double_click();
  void delay_action(int msec, ItemObject* obj);

  void create_menu();
  void cleanup();
  void create_scintilla();

  // overrides
  int  notify(int id, void* ph);
  bool command(int id, int code);
  bool query_close();
  void on_close();
  void timer();
  int handle_user(long lparam, long wparam);
  
  SFrame(const char*);
  ~SFrame();

};

extern SFrame* gMainFrame;

#endif


